import streamlit as st
import pandas as pd
import numpy as np
from datetime import datetime

# 设置页面配置（必须是第一个Streamlit命令）
st.set_page_config(
    page_title="我的第一个Streamlit应用",  # 页面标题
    page_icon="🎈",                      # 页面图标
    layout="wide",                       # 页面布局：wide或centered
)

# 应用标题
st.title("🎈 我的第一个Streamlit应用")
st.write("这是一个简单的Streamlit示例应用，展示了基本功能。")

# 在侧边栏添加控件
with st.sidebar:
    st.header("⚙️ 控制面板")
    st.write("在这里调整应用参数")
    
    # 滑块控件
    num_points = st.slider(
        "选择数据点数量", 
        min_value=10, 
        max_value=100, 
        value=30,
        help="选择要生成的数据点数量"
    )
    
    # 颜色选择器
    color = st.color_picker("选择图表颜色", "#1f77b4")

# 创建两列布局
col1, col2 = st.columns(2)

with col1:
    st.header("📊 数据生成")
    
    # 生成随机数据
    np.random.seed(42)  # 设置随机种子以保证可重复性
    data = pd.DataFrame({
        'x': np.arange(num_points),
        'y': np.random.randn(num_points).cumsum()  # 随机游走数据
    })
    
    # 显示数据
    st.write("生成的数据预览：")
    st.dataframe(data.head(), use_container_width=True)
    
    # 显示数据统计信息
    st.write("数据统计信息：")
    st.json({
        "数据点数量": len(data),
        "X范围": [data['x'].min(), data['x'].max()],
        "Y范围": [round(data['y'].min(), 2), round(data['y'].max(), 2)]
    })

with col2:
    st.header("📈 数据可视化")
    
    # 绘制折线图
    st.line_chart(
        data, 
        x='x', 
        y='y',
        color=color,
        use_container_width=True
    )
    
    # 添加一些指标卡片
    st.metric(
        label="当前数据点数", 
        value=num_points,
        delta=num_points - 50 if num_points > 50 else None
    )

# 添加一个分隔线
st.divider()

# 表单示例
st.header("📝 用户反馈")
with st.form("feedback_form"):
    # 文本输入
    name = st.text_input("您的姓名", placeholder="请输入您的姓名")
    
    # 单选按钮
    rating = st.radio(
        "您给这个应用打几分？",
        options=["⭐", "⭐⭐", "⭐⭐⭐", "⭐⭐⭐⭐", "⭐⭐⭐⭐⭐"],
        horizontal=True
    )
    
    # 多行文本输入
    feedback = st.text_area(
        "您的反馈意见", 
        placeholder="请分享您的想法...",
        height=100
    )
    
    # 表单提交按钮
    submitted = st.form_submit_button("提交反馈")
    
    if submitted:
        if name and feedback:
            st.success(f"谢谢 {name} 的{rating}评价！您的反馈已收到。")
            # 这里可以添加代码将反馈保存到数据库或文件
        else:
            st.warning("请填写姓名和反馈内容")

# 添加一些交互元素
st.header("🎯 额外功能")

# 按钮示例
if st.button("点击我显示惊喜"):
    st.balloons()  # 显示气球动画
    st.success("🎉 恭喜你发现了一个惊喜！")

# 复选框示例
if st.checkbox("显示原始数据"):
    st.write("完整数据：")
    st.dataframe(data, use_container_width=True)

# 文件上传器示例
uploaded_file = st.file_uploader(
    "上传一个CSV文件（可选）", 
    type=['csv'],
    help="支持上传CSV文件进行分析"
)

if uploaded_file is not None:
    try:
        df = pd.read_csv(uploaded_file)
        st.write(f"成功上传文件！包含 {len(df)} 行数据")
        st.dataframe(df.head())
    except Exception as e:
        st.error(f"文件读取错误: {e}")

# 进度条示例（模拟长时间操作）
if st.button("开始处理数据"):
    progress_bar = st.progress(0)
    status_text = st.empty()
    
    for i in range(100):
        # 更新进度条
        progress_bar.progress(i + 1)
        status_text.text(f"处理中... {i + 1}%")
        # 模拟处理时间
        import time
        time.sleep(0.02)
    
    status_text.text("处理完成！")
    st.success("✅ 数据处理完成")

# 页脚信息
st.divider()
st.caption(f"© 2024 我的应用 | 最后更新: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

# 扩展功能（默认隐藏）
with st.expander("🛠️ 开发者选项"):
    st.code("""
# 这是一个代码块示例
def hello_world():
    print("Hello, Streamlit!")
    
hello_world()
    """, language='python')
    
    # 下载按钮示例
    csv = data.to_csv(index=False)
    st.download_button(
        label="下载生成的数据",
        data=csv,
        file_name="generated_data.csv",
        mime="text/csv",
    )

# 运行示例：streamlit run Streamlit应用示例.py